#ifndef _ZNET_H_
#define _ZNET_H_


#include <stdint.h>
#include "list.h"


#define ZNET_TCP_BACKLOG         (4)
#define ZNET_TCP_SESSION_MAX     (1024)


typedef struct {
    int sock;

    /* session info */
    int port;
    char addr[16];

    union {
        void *ptr;
        int  data;
    } user;
    list_t node;
} zsess_t;


#define ZNET_SERVER     1
#define ZNET_CLIENT     2

typedef struct {
    int sock; // private

    /* server or client */
    int port;

    /* client */
    char *addr;

    /* server */
    int epfd; // private

    void (*on_launch)(int port);
    int (*on_open)(zsess_t *s);
    void (*on_recv)(zsess_t *s);
    void (*on_exit)(zsess_t *s);

    list_t head; // private
} znet_t;


int znet_launch(znet_t *znet, int role);
int znet_shutdown(int sock);

int znet_send(int sock, void *buf, int len);
int znet_recv(int sock, void *buf, int len);
int znet_send_all(int sock, void *buf, int len);
int znet_recv_all(int sock, void *buf, int len);


#endif
